package cn.tedu.csmall.product.webapi.controller;

import cn.tedu.csmall.common.ex.ServiceException;
import cn.tedu.csmall.common.web.JsonResult;
import cn.tedu.csmall.pojo.dto.CategoryAddNewDTO;
import cn.tedu.csmall.pojo.vo.CategoryDetailsVO;
import cn.tedu.csmall.pojo.vo.CategorySimpleListItemVO;
import cn.tedu.csmall.product.service.ICategoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping(value = "/categories", produces = "application/json; charset=utf-8")
public class CategoryController {

    public CategoryController() {
        System.out.println("CategoryController.CategoryController()");
    }

    @Autowired
    private ICategoryService categoryService;

    @PostMapping("/add-new")
    public JsonResult<Void> addNew(@Validated CategoryAddNewDTO categoryAddNewDTO) throws ServiceException {
        categoryService.addNew(categoryAddNewDTO);
        return JsonResult.ok();
    }

    @GetMapping("/{id}")
    public JsonResult<CategoryDetailsVO> getDetailsById(@PathVariable Long id) {
        CategoryDetailsVO category = categoryService.getDetailsById(id);
        return JsonResult.ok(category);
    }

    @GetMapping("/list-by-parent")
    public JsonResult<List<CategorySimpleListItemVO>> listByParentId(Long parentId) {
        // 调用service并将结果封装到JsonResult中
        List<CategorySimpleListItemVO> list = categoryService.listByParentId(parentId);
        return JsonResult.ok(list);
    }

//    1. 根据类别的id，禁用对应的类别
//- 类别不存在时抛出异常
//- 类别已禁用时抛出异常
    @RequestMapping("/disabledById")
    public JsonResult disabledById(Integer id) throws ServiceException {
        return categoryService.disabledById(id);
    }
    //2. 根据类别的id，启用对应的类别
    //- 类别不存在时抛出异常
    //- 类别已启用时抛出异常
    @RequestMapping("/stateById")
    public JsonResult stateById(Integer id) throws ServiceException {
        return categoryService.disabledById(id);
    }
    //3. 根据类别的id，隐藏（调整is_display的值）对应的类别（调整is_display的值）
    //            - 类别不存在时抛出异常
    //- 类别已隐藏时抛出异常
    @RequestMapping("/concealById")
    public JsonResult concealById(Integer id) throws ServiceException {
        return categoryService.concealById(id);
    }
    //4. 根据类别的id，显示（调整is_display的值）对应的类别
    //- 类别不存在时抛出异常
    //- 类别已显示时抛出异常
    @RequestMapping("/showById")
    public JsonResult showById(Integer id) throws ServiceException {
            return categoryService.showById(id);
        }
    //5. 根据类别的id，删除对应的类别
    //- 类别不存在时抛出异常
    //- 类别存在子级类别时抛出异常
    //- 如果删除的类别是父级类别中的最后一个类别，删除成功后，父级类别的is_parent需更新为0）
    @RequestMapping("/deleteById")
    public JsonResult deleteById(Integer id) throws ServiceException {
        return categoryService.deleteById(id);
    }
    //  6. 根据类别的id，修改对应的类别的基本信息，包括：名称、关键字、图标、排序序号
    //- 类别不存在时抛出异常
    //- 新名称已经被占用时抛出异常
    @RequestMapping("/updataById")
    public JsonResult updataById(CategorySimpleListItemVO categorySimpleListItemVO) throws ServiceException {
        return categoryService.updataById(categorySimpleListItemVO);
    }
    //7. 重建缓存
    //    当请求 /categories/cache/rebuild 路径时，将重建Redis缓存中的所有类别数据（与缓存预热相同的处理）
    @RequestMapping("/onRedis")
    public JsonResult onRedis(){
        return JsonResult.ok("缓存成功");
    }
}
